Linux-Kernel 新增System Call
我的環境是 OS:Ubuntu 14.04 LTS(32bits-i386) CPU:i7-2600
Linux版本為linux-3.10.60
- 到Linux Kernel Archives 下載Source Code到Desktop Link ,我是下載3.10.60.tar.xz版本
- 解壓linux-3.10.60.tar.xz1xz -d linux-3.10.60.tar.xz
- 解壓linux-3.10.60.tar1tar xvf linux-3.10.60.tar
- 到~/Desktop/linux-3.10.60/arch/x86/kernel建立helloworld.c的程式,其就是我們的System Call
~/Desktop/linux-3.10.60/arch/x86/kernel 12345678#include <linux/linkage.h>#include <linux/kernel.h>asmlinkage int sys_helloworld(void){printk(KERN_EMERG "Hello World");return 1;} - 到~/Desktop/linux-3.10.60/include/linux/syscalls.h中增加
~/Desktop/linux-3.10.60/include/linux/syscalls.h 1asmlinkage int sys_helloworld(void); - 到~/Desktop/linux-3.10.60/arch/x86/syscalls/syscall_32.tbl中增加
~/Desktop/linux-3.10.60/arch/x86/syscalls/syscall_32.tbl 1351 i386 helloworld sys_helloworld
注意Entry不一定是351,要隨下載的Kernel Source Code作調整 - 到~/Desktop/linux-3.10.60/arch/x86/kernel/Makefile中增加
~/Desktop/linux-3.10.60/arch/x86/kernel/Makefile 1obj-y+= helloworld.o
這樣新增System Call就告一段落,再來是編譯Kernel - 安裝編譯會用到的套件1sudo apt-get install fakeroot build-essential kernel-package libncurses5 libncurses5-dev
- 把現在系統的config複製出來到改過的Kernel中123cd ~/Desktop/linux-3.10.60cp /boot/config-linux-3.10.60 ./.configmake menuconifg
- 到menuconifg畫面時,選擇Save改名為.config就好,之後按Exit離開
- Compile Kernel12make-kpkg cleanfakeroot make-kpkg --initrd kernel_image kernel_headers
Compile Kernel會花相當多時間,要有耐心等待,在fakeroot make-kpkg —initrd kernel_image kernel_headers後方加入 -j [邏輯核心數],用多核心去跑會比較快 - 經過漫長的等待,會輸出兩個檔案linux-image-3.10.60.Custom_i386.deb和linux-headers-3.10.60.Custom_i386.deb,安裝他們12sudo dpkg -i linux-image-3.10.60.Custom_i386.debsudo dpkg -i linux-headers-3.10.60.Custom_i386.deb
- 接下來重開機
- 輸入uname -r 可以檢查是否更新Kernel
安裝完kernel一定要重開機,否則不會更新版本 - 寫一個call System Call的小程式
test.c 12345678#include <syscall.h>#include <sys/types.h>int main(void){int a=syscall(351);return 0;} - 測試和編譯12gcc -o test test.c./test
在terminal上不會跑出結果出來,要輸入dmesg,結果才會跑出來